package SortStudy;

import java.lang.reflect.Constructor;
import java.lang.reflect.Type;

public class SortUtil {

    /**
     * 排序方法调用
     * @param in
     * @param sortType maoPao--冒泡排序  insert--插入排序
     *                 shell--希尔排序   quick--快速排序
     *                 merge--归并排序   heap--堆排序
     *                 counting--计数排序
     * @return 返回排序后的结果
     */
    public static <T extends Comparable> Object[] Sort(T[] in,String sortType){
        if(sortType.equals("maoPao")){
            return SortCore.maoPaoSort(in);
        }
        if(sortType.equals("insert")){
            return SortCore.InsertionSort(in);
        }
        if(sortType.equals("shell")){
            return SortCore.ShellSort(in,in.length-1);
        }
        if(sortType.equals("quick")){
            return SortCore.quickSort(in,0,in.length-1);
        }
        if(sortType.equals("merge")){
            return SortCore.mergeSort(in,0,in.length-1);
        }
//        if(sortType.equals("heap")){
//            return new SortCore.Heap().Heapsort(null,in,in.length);
//        }

        return null;
    }

    /**
     * 随机数组生成器，此方法可以生成普通数字类型,浮动数字类型 字符串类型的数组
     * 推荐使用：整数类型 Integer 浮动数类型 Double 字符串类型 String
     * @param type 元素类型
     * @param count 数组大小
     * @param <T> 泛型类型
     * @return 返回生成后的数组
     */
    public static <T extends Comparable> Object[] makeRandomArray(T type,Integer count) throws Exception {
        Object[] result=new Object[count];
        Class cl=type.getClass();
        Constructor[] constructors=cl.getDeclaredConstructors();
        Constructor constructor=null;
        for(Constructor constructor1:constructors){
            Class[] types = constructor1.getParameterTypes();
            if(types.length==1&&types[0]==String.class){
                constructor=constructor1;
                break;
            }
        }
        if(constructor==null){
            throw new Exception("此类型不支持生成随机类型");
        }
        for(int i=0;i<count;i++){
            String emuStr=null;
            double emu = 0;
            if(type.getClass()==String.class){
                int strLength=(int)(Math.random()*10);
                if(strLength<1){
                    strLength=1;
                }
                StringBuilder strBul=new StringBuilder();
                for(int j=0;j<strLength;j++){
                    int num=(int)(Math.random()*122);
                    while (num<97){
                        num=(int)(Math.random()*122);
                    }
                    char letter=(char) num;
                    strBul.append(letter);
                }
                emuStr=strBul.toString();
            }else{
                emu=(Math.random()*1000);
                emuStr= Double.toString(emu);
            }
            try{
                result[i]=constructor.newInstance(emuStr);
            }catch (Exception e){
                int emuInt=(int)emu;
                emuStr=Integer.toString(emuInt);
                result[i]=constructor.newInstance(emuStr);
            }
        }
        return  result;
    }



}
